<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <link rel="shortcut icon" href="../../favicon.ico" type="image/x-icon">
	<title>react_state</title>
</head>
<body>
  <div id="test"></div>

  <script type="text/javascript" src="../../js/react.development.js" ></script>
  <script type="text/javascript" src="../../js/react-dom.development.js"></script>
  <script type="text/javascript" src="../../js/babel.min.js"></script>

  <script type="text/babel">
    class Weather extends React.Component {
      constructor(props){
        super(props)
        this.state = {
          isCool: true
        }
        this.changeWeather = this.changeWeather.bind(this)
      }

      changeWeather(){
        // 此处的this为undefined. 因为changeWeather函数被赋给了onClick, 从通过实例调用改为了直接调用
        // 直接调用时this就不再指向实例,而默认是指向window, 但是在class里面, 方法默认开启了局部的严格模式
        // 该模式禁止this指向window, 因此this指向了undefined.
        // 解决方法, 初始化调用构造函数时利用bind将原型链上的函数重新生成一个新的函数, 并将当前实例作为第一个参数传进bind,
        // 使新函数内的this确实指向当前实例, 然后将这个新的函数赋值给当前实例的同名属性. 这样当前实例同名属性就成为一个同名函数,
        // onClick调用时就不会再用原型链上的函数, 而是用实例上的同名函数. 该同名函数中的this被强制绑定到当前实例
        console.log(this)
        // 直接修改state不会导致页面渲染
        // this.state.isCool = !this.state.isCool
        const isCool = this.state.isCool;
        this.setState({
          isCool: !isCool
        })
      }

      render(){
        const {isCool} = this.state;
        const weather = isCool?'凉爽':'炎热';

        console.log(this);
        return <h1 onClick={this.changeWeather}>今天天气很{weather}</h1>
      }
    }

    ReactDOM.render(<Weather />, document.getElementById('test'));
  </script>
</body>